package com.daji.concurrency.multithread_synchronized;

//本例接B02 是一个错误使用synchronized的例子
/*
结果并不是0，这是因为两个线程各自的synchronized锁住的不是同一个对象！
这使得两个线程各自都可以同时获得锁：因为JVM只保证同一个锁在任意时刻只能被一个线程获取，
但两个不同的锁在同一时刻可以被两个线程分别获取。

因此，使用synchronized的时候，获取到的是哪个锁非常重要。锁对象如果不对，代码逻辑就不对。


*/
public class B03_WrongSync1 {
    public static void main(String[] args) throws Exception {
        Thread add = new AddThread();
        Thread dec = new DecThread();
        add.start();
        dec.start();
        add.join();
        dec.join();
        System.out.println(Counter2.count);
    }
}

class Counter2 {
    public static final Object lock1 = new Object();
    public static final Object lock2 = new Object();
    public static int count = 0;
}

class AddThread extends Thread {
    public void run() {
        for (int i=0; i<10000; i++) {
            //这里有错！！
            synchronized(Counter2.lock1) {
                Counter2.count += 1;
            }
        }
    }
}

class DecThread extends Thread {
    public void run() {
        for (int i=0; i<10000; i++) {
            //这里有错！！
            synchronized(Counter2.lock2) {
                Counter2.count -= 1;
            }
        }
    }
}